import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
// import { getTimeStamp } from '@/utils/storage'
// const TimeOut = 3600000 * 2 // 定义token超时时间

// create an axios instance
const refreshTokenReq = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// create an axios instance
const request = axios.create({
  // 设置基础路径 环境变量 npm run dev  /api   /生产环境 npm run build  /prod-api
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // request timeout 超时时间 毫秒为单位
  // headers: {
  //   'Content-Type': 'application/json;charset=UTF-8',
  // },
})

// request interceptor 请求拦截器
request.interceptors.request.use(
  async config => {
    // 取token // 在这个位置需要统一的去注入token
    if (store.getters.token) {
      // 只有在有token的情况下 才有必要去检查时间戳是否超时
      // if (CheckIsTimeOut()) {
      //   await store.dispatch('user/logout')// 调用登出操作
      //   redirectLogin()// 跳转登录页面
      //   return Promise.reject(new Error('您的登录已失效，请重新登录'))
      // }
      // 如果token存在 注入token
      config.headers.Authorization = `Bearer ${store.getters.token}`
    }
    return config// 这里一定要注意 一定要return config
  },
  error => {
    return Promise.reject(error)
  }
)

// response interceptor 响应拦截器
request.interceptors.response.use(
  response => {
    const { code, message, data } = response.data
    if (code === 0) {
      return data // 返回用户所需要的数据
    } else {
      return Promise.reject(new Error(message))// 提示错误消息
    }
  }, async error => {
    // error 有response对象 config
    const status = error.response.status
    if (status === 400) {
      Toast.fail('客户端请求参数错误')
    } else if (status === 401 && error.response && error.response.data) {
      console.log('token无效')
      // 如果本地没有token直接跳转到登录页面
      if (!store.getters.token) return redirectLogin()

      // 使用refresh_token,请求获取最新的token
      try {
        const data = await refreshTokenReq({
          method: 'GET',
          url: '/api/m/user/refresh_token',
          headers: {
            Authorization: `Bearer ${store.getters.refresh_token}`
          }
        })
        // 拿到新的token之后把它更新到本地中
        store.commit('user/SET_TOKEN', data.data.data.token)

        // 把失败的请求重新发出去
        // error.config 是本次请求的相关配置信息对象
        return request(error.config.url)
      } catch (error) {
        // 请求refresh_token失败 ,直接跳转登录页
        redirectLogin()
      }
    } else if (status === 403) {
      Toast.fail('没有权限操作')
    } else if (status >= 500) {
      Toast.fail('服务端错误')
    }
    return Promise.reject(error)// reject// 打印错误
  })

// 跳转到login页面
async function redirectLogin () {
  router.replace({
    name: 'login',
    query: {
      redirect: router.currentRoute.fullPath
    }
  })
}
// 检查token是否过期 超时逻辑  (当前时间  - 缓存中的时间) 是否大于 时间差
// function CheckIsTimeOut () {
//   // 当前时间  - 存储的时间戳 > 时效性  false   tr
//   return (Date.now() - getTimeStamp()) / 1000 > TimeOut
// }
export default request
